/*************************************************************************
	> File Name: dataitem.h
	> Author: xuwenlong
	> Mail: myxuan475@126.com 
	> Created Time: 2018年02月24日 星期六 16时00分52秒
 ************************************************************************/
#ifndef __DATAITEM_H__
#define __DATAITEM_H__

#include <stdio.h>
#include <string>
#include "operator.h"
#include "opitem.h"

using namespace std;
class Operator;
class DataItem;
typedef utils::SharedPtr<DataItem> tDataItem;

class DataItem:public OpInterface
{
public:
    DataItem(const ID_DEV &devId,const S32 modelId);
    DataItem();
    DataItem(const DataItem &item);
    virtual ~DataItem();

    BOOL IsEmpty();

    /*
     * 解析表达式
     */

    virtual std::string& GetName();
    virtual std::string& GetDot();
    virtual S32 GetItemId() const;

    virtual void SetAddr(ID_DEV &devId);
    virtual void SetTempleId(S32 modelId);
    virtual void SetName(const std::string& name);
    virtual void SetDot(const std::string& dot);
    virtual void SetItemId(S32 itemId);
    virtual void SetRegLength(S32 reglen);
    virtual void ParseParams(
            const vector<string>& params);

    static vector<OpValue> ParseString(
            const string &str);
    virtual void CalcParams(const vector<OpValue>& params);
    virtual void ParseDataExpr(const string& expr,F32 rate);

    //采集
    virtual tExpress LocateFunction(const string &def, int funcId = -1);
    virtual const ID_DEV &DevAddr();
    virtual const S32 RegLength();

    virtual OpValue Result();
    virtual TYPE_DEFINE DataType();

    OpValue FuncCall();
    OpValue RateCall(OpValue &result, float rate);
    OpValue GenerateNext();

    RECV_RESULT ParseRecvCmd(const CmdValue &recvCmd,
            S32 funcId = -1);

    OpValue GenerateCmd();

    void ResetCmd();
    string FuncName(int flag);

    bool isCmdEqual(const tDataItem &item);
    bool isParamEqual(const tDataItem &item);
private:
    tExpress getExpr(int flag, int funcId);

    static tExpress wrapExpress(const string &str);

    class ParamsLock
    {
      public:
        ParamsLock(Operator &iop_):
            iop(iop_) {
            iop.PushStack(Operator::AUTO_PARAM);
        }
        ~ParamsLock() {
            iop.PopStack(Operator::AUTO_PARAM);
        }
    private:
        Operator &iop;
    };
private:
    vector<tExpress>  m_listExprs;
    vector<OpValue>   m_listValues;

    Operator    m_iOperator;
    S32         m_iItemId;
    S32         m_modelId;
    ID_DEV      m_iDevAddr;
    std::string m_strname;
    std::string m_strdot;
    S32         m_reglen;
    tExpress    m_tDataExpr;
    F32         m_fRate;
    S32         m_iFuncId;
};

#endif
